package circle.negocios;


public class CalcularDigitosVerificadores {
	
	private final int[] vetorPesos = {10, 9, 8, 7, 6, 5, 4, 3, 2};
	private final int[] vetorPesos2 = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2};
	private final int pesoCalculoResto = 11;
	private final int tamanhoVetorPrimeiroDigito = 9;
	private final int tamanhoVetorSegundoDigito = 10;
	private final int tamanhoVetorCPF = 11;
	
	public CalcularDigitosVerificadores() {
	}
	
	public int gerarPrimeiroDigitoVerificador(int[] vetor){
		
		int[] vetorResultado = new int[tamanhoVetorPrimeiroDigito];
		int somaVetor = 0;
		int restoDivisao;
		int digitoVerificador;
		
		for(int i = 0; i < vetor.length; i++){
			vetorResultado[i] = (vetor[i] * vetorPesos[i]);
		}
		
		for(int i = 0; i < vetorResultado.length; i++){
			somaVetor = (somaVetor + vetorResultado[i]);
		}
		
		restoDivisao = (somaVetor % pesoCalculoResto);
		
		if(restoDivisao < 2){
			digitoVerificador = 0;
		} else {
			digitoVerificador = pesoCalculoResto - restoDivisao;
		}
		
		return digitoVerificador;
	}
	
	public int gerarSegundoDigitoVerificador(int[] vetor){
		
		int[] vetorResultado = new int[tamanhoVetorSegundoDigito];
		int somaVetor = 0;
		int restoDivisao;
		int digitoVerificador;
		
		for(int i = 0; i < vetor.length; i++){
			vetorResultado[i] = (vetor[i] * vetorPesos2[i]);
		}
		
		for(int i = 0; i < vetorResultado.length; i++){
			somaVetor= (somaVetor + vetorResultado[i]);
		}
		
		restoDivisao = (somaVetor % pesoCalculoResto);
		
		if(restoDivisao < 2){
			digitoVerificador = 0;
		} else {
			digitoVerificador = pesoCalculoResto - restoDivisao;
		}
		
		return digitoVerificador;
	}
	
	public int[] gerarDigitosVerificadoresComoVetor(int[] vetor){
		
		int primeiroDigito;
		int segundoDigito;
		int[] vetorPrimeiroDigito = new int[tamanhoVetorSegundoDigito];
		int[] cpf = new int[tamanhoVetorCPF];
		
		primeiroDigito = gerarPrimeiroDigitoVerificador(vetor);
		
		for(int i = 0; i < vetor.length; i++){
			vetorPrimeiroDigito[i] = vetor[i];
		}
		
		vetorPrimeiroDigito[tamanhoVetorSegundoDigito - 1] = primeiroDigito;
		
		segundoDigito = gerarSegundoDigitoVerificador(vetorPrimeiroDigito);
		
		for(int i = 0; i < vetorPrimeiroDigito.length; i++){
			cpf[i] = vetorPrimeiroDigito[i];
		}
		
		cpf[tamanhoVetorCPF - 1] = segundoDigito;
		
		return cpf;
	}
	
	public String gerarDigitosVerificadoresSemMascara(int[] vetor){
		int[] cpf = new int[tamanhoVetorCPF];
		StringBuffer strCPF = new StringBuffer();
		
		cpf = gerarDigitosVerificadoresComoVetor(vetor);
		
		for(int i = 0; i < cpf.length; i++){
			strCPF.append(cpf[i]);
		}
		
		String sCPF = strCPF.toString();
				
		return sCPF;
	}
	
	public String gerarDigitosVerificadoresComMascara(int[] vetor){
		int[] cpf = new int[tamanhoVetorCPF];
		int x = 0;
		StringBuffer strCPF = new StringBuffer();
		
		cpf = gerarDigitosVerificadoresComoVetor(vetor);
		
		for(int i = 0; i < 3; i++){
			for(int j = 0; j < 3; j++){
				strCPF.append(cpf[j + x]);
			}
			
			if(i < 2){
				strCPF.append(".");
			} else {
				strCPF.append("-");
			}
			
			x = x + 3;
		}
		
		for(int i = cpf.length - 2; i < cpf.length; i++){
			strCPF.append(cpf[i]);
		}
				
		return strCPF.toString();
	}
}
